/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package co.edu.distribuidos.conectividad;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import net.jxta.socket.JxtaSocket;

/**
 *
 * @author alvar-go@uniandes.edu.co
 */
public class ThreadTemplate extends Thread{

    private JxtaSocket canal;

    private BufferedReader in;

    private PrintWriter out;


    public ThreadTemplate(JxtaSocket socket)throws Exception{
        try {
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            out = new PrintWriter(socket.getOutputStream(), true);
            canal = socket;
        } catch (Exception e) {
            throw new Exception("No se puedo crear el proceso.\n" + e.getMessage());
        }
    }

    public String leerLinea() throws Exception{
        try {
             return in.readLine();
        } catch (Exception e) {
            throw new Exception("No fue posible leer información.\n" + e.getMessage());
        }
    }

    public void enviarLinea(String linea){
        out.println(linea);
    }

    public void enviarArchivo(File envio) throws Exception{
        try {
            ObjectOutputStream oos = new ObjectOutputStream(canal.getOutputStream());
            FileInputStream inf = new FileInputStream(envio);
            byte[] buffer = new byte[4096];
            int bytesPorLeer;
            while ((bytesPorLeer = inf.read(buffer)) != -1){
                    oos.write(buffer, 0, bytesPorLeer);
            }
            oos.write(-1);
            oos.close();
            inf.close();
        } catch (Exception e) {
            throw new Exception("No se pudo enviar el archivo.");
        }
    }

    public void recibirArchivo(String ruta) throws Exception{
        try {
            ObjectInputStream ois = new ObjectInputStream(canal.getInputStream());
            File archivo = new File(ruta);
            if( !archivo.exists() ){
                archivo.createNewFile();
            }
            FileOutputStream outf = new FileOutputStream(archivo);
            byte[] buffer = new byte[4096];
            int bytesPorLeer;
            while ((bytesPorLeer = ois.read(buffer)) != -1){
                    outf.write(buffer, 0, bytesPorLeer);
            }
            ois.close();
            outf.close();
        } catch (Exception e) {
            throw new Exception("No se pudo recibir el archivo.");
        }
    }

}
